home *** CD-ROM | disk | FTP | other *** search
/ Kompuutteri K-CD 2002 #1 / K-CD_2002-01.iso / Delphi / INSTALL / program files / Borland / Delphi6 / Source / Rtl / Win / Mapi.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2001-05-22  |  22.2 KB  |  597 lines

  1. { *********************************************************************** }
  2. {                                                                         }
  3. { Delphi Runtime Library                                                  }
  4. {                                                                         }
  5. { Copyright (c) 1996-2001 Borland Software Corporation                    }
  6. {                                                                         }
  7. { *********************************************************************** }
  8.  
  9. {*******************************************************}
  10. {       Simple MAPI Interface Unit                      }
  11. {*******************************************************}
  12.  
  13. unit Mapi;
  14.  
  15. {NOTE: Do not place the $NOPACKAGEUNIT directive in this file}
  16.  
  17. interface
  18.  
  19. uses Windows;
  20.  
  21. {
  22.   Messaging Applications Programming Interface.
  23.  
  24.   Purpose:
  25.  
  26.     This file defines the structures and constants used by that
  27.     subset of the Messaging Applications Programming Interface
  28.     which is supported under Windows by Microsoft Mail for PC
  29.     Networks version 3.x.
  30. }
  31.  
  32. (*$HPPEMIT '#include <mapi.h>'*)
  33.  
  34. type
  35.   {$EXTERNALSYM FLAGS}
  36.   FLAGS = Cardinal;
  37.   {$EXTERNALSYM LHANDLE}
  38.   LHANDLE = Cardinal;
  39.   PLHANDLE = ^Cardinal;
  40.  
  41. const
  42.   {$EXTERNALSYM lhSessionNull}
  43.   lhSessionNull = (0);
  44.  
  45. type
  46.   PMapiFileDesc = ^TMapiFileDesc;
  47.   {$EXTERNALSYM MapiFileDesc}
  48.   MapiFileDesc = packed record
  49.     ulReserved: Cardinal;        { Reserved for future use (must be 0)     }
  50.     flFlags: Cardinal;           { Flags                                   }
  51.     nPosition: Cardinal;         { character in text to be replaced by attachment }
  52.     lpszPathName: LPSTR;         { Full path name of attachment file       }
  53.     lpszFileName: LPSTR;         { Original file name (optional)           }
  54.     lpFileType: Pointer;         { Attachment file type (can be lpMapiFileTagExt) }
  55.   end;
  56.   TMapiFileDesc = MapiFileDesc;
  57.  
  58. const
  59.   {$EXTERNALSYM MAPI_OLE}
  60.   MAPI_OLE = $00000001;
  61.   {$EXTERNALSYM MAPI_OLE_STATIC}
  62.   MAPI_OLE_STATIC = $00000002;
  63.  
  64.  
  65. type
  66.   PMapiFileTagExt = ^TMapiFileTagExt;
  67.   {$EXTERNALSYM MapiFileTagExt}
  68.   MapiFileTagExt = packed record
  69.     ulReserved: Cardinal;       { Reserved, must be zero.                  }
  70.     cbTag: Cardinal;            { Size (in bytes) of                       }
  71.     lpTag: PByte;               { X.400 OID for this attachment type       }
  72.     cbEncoding: Cardinal;       { Size (in bytes) of                       }
  73.     lpEncoding: PByte;          { X.400 OID for this attachment's encoding }
  74.   end;
  75.   TMapiFileTagExt = MapiFileTagExt;
  76.  
  77.  
  78.   PMapiRecipDesc = ^TMapiRecipDesc;
  79.   {$EXTERNALSYM MapiRecipDesc}
  80.   MapiRecipDesc = packed record
  81.     ulReserved: Cardinal;       { Reserved for future use                  }
  82.     ulRecipClass: Cardinal;     { Recipient class                          }
  83.                                 { MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG    }
  84.     lpszName: LPSTR;            { Recipient name                           }
  85.     lpszAddress: LPSTR;         { Recipient address (optional)             }
  86.     ulEIDSize: Cardinal;        { Count in bytes of size of pEntryID       }
  87.     lpEntryID: Pointer;         { System-specific recipient reference      }
  88.   end;
  89.   TMapiRecipDesc = MapiRecipDesc;
  90.  
  91. const
  92.   {$EXTERNALSYM MAPI_ORIG}
  93.   MAPI_ORIG = 0;                { Recipient is message originator          }
  94.   {$EXTERNALSYM MAPI_TO}
  95.   MAPI_TO = 1;                  { Recipient is a primary recipient         }
  96.   {$EXTERNALSYM MAPI_CC}
  97.   MAPI_CC = 2;                  { Recipient is a copy recipient            }
  98.   {$EXTERNALSYM MAPI_BCC}
  99.   MAPI_BCC = 3;                 { Recipient is blind copy recipient        }
  100.  
  101. type
  102.   PMapiMessage = ^TMapiMessage;
  103.   {$EXTERNALSYM MapiMessage}
  104.   MapiMessage = packed record
  105.     ulReserved: Cardinal;         { Reserved for future use (M.B. 0)       }
  106.     lpszSubject: LPSTR;           { Message Subject                        }
  107.     lpszNoteText: LPSTR;          { Message Text                           }
  108.     lpszMessageType: LPSTR;       { Message Class                          }
  109.     lpszDateReceived: LPSTR;      { in YYYY/MM/DD HH:MM format             }
  110.     lpszConversationID: LPSTR;    { conversation thread ID                 }
  111.     flFlags: FLAGS;               { unread,return receipt                  }
  112.     lpOriginator: PMapiRecipDesc; { Originator descriptor                  }
  113.     nRecipCount: Cardinal;        { Number of recipients                   }
  114.     lpRecips: PMapiRecipDesc;     { Recipient descriptors                  }
  115.     nFileCount: Cardinal;         { # of file attachments                  }
  116.     lpFiles: PMapiFileDesc;       { Attachment descriptors                 }
  117.   end;
  118.   TMapiMessage = MapiMessage;
  119.  
  120. const
  121.   {$EXTERNALSYM MAPI_UNREAD}
  122.   MAPI_UNREAD = $00000001;
  123.   {$EXTERNALSYM MAPI_RECEIPT_REQUESTED}
  124.   MAPI_RECEIPT_REQUESTED = $00000002;
  125.   {$EXTERNALSYM MAPI_SENT}
  126.   MAPI_SENT = $00000004;
  127.  
  128.  
  129. { Entry points. }
  130.  
  131. { flFlags values for Simple MAPI entry points. All documented flags are
  132.   shown for each call. Duplicates are commented out but remain present
  133.   for every call. }
  134.  
  135. { MAPILogon() flags. }
  136.  
  137.   {$EXTERNALSYM MAPI_LOGON_UI}
  138.   MAPI_LOGON_UI = $00000001;                { Display logon UI             }
  139.   {$EXTERNALSYM MAPI_PASSWORD_UI}
  140.   MAPI_PASSWORD_UI = $00020000;             { prompt for password only     }
  141.   {$EXTERNALSYM MAPI_NEW_SESSION}
  142.   MAPI_NEW_SESSION = $00000002;             { Don't use shared session     }
  143.   {$EXTERNALSYM MAPI_FORCE_DOWNLOAD}
  144.   MAPI_FORCE_DOWNLOAD = $00001000;          { Get new mail before return   }
  145.   {$EXTERNALSYM MAPI_ALLOW_OTHERS}
  146.   MAPI_ALLOW_OTHERS = $00000008;            { Make this a shared session   (removed from 4.0 SDK) }
  147.   {$EXTERNALSYM MAPI_EXPLICIT_PROFILE}
  148.   MAPI_EXPLICIT_PROFILE = $00000010;        { Don't use default profile    (removed from 4.0 SDK) }
  149.   {$EXTERNALSYM MAPI_EXTENDED}
  150.   MAPI_EXTENDED = $00000020;                { Extended MAPI Logon          }
  151.   {$EXTERNALSYM MAPI_USE_DEFAULT}
  152.   MAPI_USE_DEFAULT = $00000040;             { Use default profile in logon (removed from 4.0 SDK) }
  153.  
  154.   {$EXTERNALSYM MAPI_SIMPLE_DEFAULT}
  155.   MAPI_SIMPLE_DEFAULT = MAPI_LOGON_UI or MAPI_FORCE_DOWNLOAD or MAPI_ALLOW_OTHERS; { removed from 4.0 SDK }
  156.   {$EXTERNALSYM MAPI_SIMPLE_EXPLICIT}
  157.   MAPI_SIMPLE_EXPLICIT = MAPI_NEW_SESSION or MAPI_FORCE_DOWNLOAD or MAPI_EXPLICIT_PROFILE; { removed from 4.0 SDK }
  158.  
  159. { MAPILogoff() flags.      }
  160.  
  161.   {$EXTERNALSYM MAPI_LOGOFF_SHARED}
  162.   MAPI_LOGOFF_SHARED = $00000001;           { Close all shared sessions  (removed from 4.0 SDK)  }
  163.   {$EXTERNALSYM MAPI_LOGOFF_UI}
  164.   MAPI_LOGOFF_UI = $00000002;               { It's OK to present UI      (removed from 4.0 SDK)  }
  165.  
  166. { MAPISendMail() flags.    }
  167.  
  168. { #define MAPI_LOGON_UI        0x00000001     Display logon UI             }
  169. { #define MAPI_NEW_SESSION     0x00000002     Don't use shared session     }
  170.   {$EXTERNALSYM MAPI_DIALOG}
  171.   MAPI_DIALOG = $00000008;                  { Display a send note UI       }
  172. { # define MAPI_USE_DEFAULT     0x00000040     Use default profile in logon }
  173.  
  174. { MAPIFindNext() flags.    }
  175.  
  176.   {$EXTERNALSYM MAPI_UNREAD_ONLY}
  177.   MAPI_UNREAD_ONLY = $00000020;             { Only unread messages         }
  178.   {$EXTERNALSYM MAPI_GUARANTEE_FIFO}
  179.   MAPI_GUARANTEE_FIFO = $00000100;          { use date order               }
  180.   {$EXTERNALSYM MAPI_LONG_MSGID}
  181.   MAPI_LONG_MSGID = $00004000;              { allow 512 char returned ID   }
  182.  
  183. { MAPIReadMail() flags.    }
  184.  
  185.   {$EXTERNALSYM MAPI_PEEK}
  186.   MAPI_PEEK = $00000080;                    { Do not mark as read.         }
  187.   {$EXTERNALSYM MAPI_SUPPRESS_ATTACH}
  188.   MAPI_SUPPRESS_ATTACH = $00000800;         { header + body, no files      }
  189.   {$EXTERNALSYM MAPI_ENVELOPE_ONLY}
  190.   MAPI_ENVELOPE_ONLY = $00000040;           { Only header information      }
  191.   {$EXTERNALSYM MAPI_BODY_AS_FILE}
  192.   MAPI_BODY_AS_FILE = $00000200;
  193.  
  194. { MAPISaveMail() flags.    }
  195.  
  196. { #define MAPI_LOGON_UI        0x00000001     Display logon UI             }
  197. { #define MAPI_NEW_SESSION     0x00000002     Don't use shared session     }
  198. { #define MAPI_LONG_MSGID      0x00004000  /* allow 512 char returned ID   }
  199.  
  200. { MAPIAddress() flags.     }
  201.  
  202. { #define MAPI_LOGON_UI        0x00000001     Display logon UI             }
  203. { #define MAPI_NEW_SESSION     0x00000002     Don't use shared session     }
  204.  
  205. { MAPIDetails() flags.     }
  206.  
  207. { #define MAPI_LOGON_UI        0x00000001     Display logon UI             }
  208. { #define MAPI_NEW_SESSION     0x00000002     Don't use shared session     }
  209.   {$EXTERNALSYM MAPI_AB_NOMODIFY}
  210.   MAPI_AB_NOMODIFY = $00000400;             { Don't allow mods of AB entries }
  211.  
  212. { MAPIResolveName() flags. }
  213.  
  214. { #define MAPI_LOGON_UI        0x00000001     Display logon UI             }
  215. { #define MAPI_NEW_SESSION     0x00000002     Don't use shared session     }
  216. { #define MAPI_DIALOG          0x00000008     Prompt for choices if ambiguous }
  217. { #define MAPI_AB_NOMODIFY     0x00000400     Don't allow mods of AB entries }
  218.  
  219. type
  220.   PFNMapiLogon = ^TFNMapiLogOn;
  221.   TFNMapiLogOn = function(ulUIParam: Cardinal; lpszProfileName: LPSTR;
  222.     lpszPassword: LPSTR; flFlags: FLAGS; ulReserved: Cardinal;
  223.     lplhSession: PLHANDLE): Cardinal stdcall;
  224.  
  225.   PFNMapiLogOff = ^TFNMapiLogOff;
  226.   TFNMapiLogOff = function(lhSession: LHANDLE; ulUIParam: Cardinal; flFlags: FLAGS;
  227.     ulReserved: Cardinal): Cardinal stdcall;
  228.  
  229.   PFNMapiSendMail = ^TFNMapiSendMail;
  230.   TFNMapiSendMail = function(lhSession: LHANDLE; ulUIParam: Cardinal;
  231.     var lpMessage: TMapiMessage; flFlags: FLAGS;
  232.     ulReserved: Cardinal): Cardinal stdcall;
  233.  
  234.   PFNMapiSendDocuments = ^TFNMapiSendDocuments;
  235.   TFNMapiSendDocuments = function(ulUIParam: Cardinal; lpszDelimChar: LPSTR;
  236.     lpszFilePaths: LPSTR; lpszFileNames: LPSTR;
  237.     ulReserved: Cardinal): Cardinal stdcall;
  238.  
  239.   PFNMapiFindNext = ^TFNMapiFindNext;
  240.   TFNMapiFindNext = function(lhSession: LHANDLE; ulUIParam: Cardinal;
  241.     lpszMessageType: LPSTR; lpszSeedMessageID: LPSTR; flFlags: FLAGS;
  242.     ulReserved: Cardinal; lpszMessageID: LPSTR): Cardinal stdcall;
  243.  
  244.   PFNMapiReadMail = ^TFNMapiReadMail;
  245.   TFNMapiReadMail = function(lhSession: LHANDLE; ulUIParam: Cardinal;
  246.     lpszMessageID: LPSTR; flFlags: FLAGS; ulReserved: Cardinal;
  247.     var lppMessage: PMapiMessage): Cardinal stdcall;
  248.  
  249.   PFNMapiSaveMail = ^TFNMapiSaveMail;
  250.   TFNMapiSaveMail = function(lhSession: LHANDLE; ulUIParam: Cardinal;
  251.     var lpMessage: TMapiMessage; flFlags: FLAGS; ulReserved: Cardinal;
  252.     lpszMessageID: LPSTR): Cardinal stdcall;
  253.  
  254.   PFNMapiDeleteMail = ^TFNMapiDeleteMail;
  255.   TFNMapiDeleteMail = function(lhSession: LHANDLE; ulUIParam: Cardinal;
  256.     lpszMessageID: LPSTR; flFlags: FLAGS;
  257.     ulReserved: Cardinal): Cardinal stdcall;
  258.  
  259.   PFNMapiFreeBuffer = ^TFNMapiFreeBuffer;
  260.   TFNMapiFreeBuffer = function(pv: Pointer): Cardinal stdcall;
  261.  
  262.   PFNMapiAddress = ^TFNMapiAddress;
  263.   TFNMapiAddress = function(lhSession: LHANDLE; ulUIParam: Cardinal;
  264.     lpszCaption: LPSTR; nEditFields: Cardinal; lpszLabels: LPSTR;
  265.     nRecips: Cardinal; var lpRecips: TMapiRecipDesc; flFlags: FLAGS;
  266.     ulReserved: Cardinal; lpnNewRecips: PULONG;
  267.     var lppNewRecips: PMapiRecipDesc): Cardinal stdcall;
  268.  
  269.   PFNMapiDetails = ^TFNMapiDetails;
  270.   TFNMapiDetails = function(lhSession: LHANDLE; ulUIParam: Cardinal;
  271.     var lpRecip: TMapiRecipDesc; flFlags: FLAGS;
  272.     ulReserved: Cardinal): Cardinal stdcall;
  273.  
  274.   PFNMapiResolveName = ^TFNMapiResolveName;
  275.   TFNMapiResolveName = function(lhSession: LHANDLE; ulUIParam: Cardinal;
  276.     lpszName: LPSTR; flFlags: FLAGS; ulReserved: Cardinal;
  277.     var lppRecip: PMapiRecipDesc): Cardinal stdcall;
  278.  
  279. const
  280.   {$EXTERNALSYM SUCCESS_SUCCESS}
  281.   SUCCESS_SUCCESS = 0;
  282.   {$EXTERNALSYM MAPI_USER_ABORT}
  283.   MAPI_USER_ABORT = 1;
  284.   {$EXTERNALSYM MAPI_E_USER_ABORT}
  285.   MAPI_E_USER_ABORT                  = MAPI_USER_ABORT;
  286.   {$EXTERNALSYM MAPI_E_FAILURE}
  287.   MAPI_E_FAILURE = 2;
  288.   {$EXTERNALSYM MAPI_E_LOGON_FAILURE}
  289.   MAPI_E_LOGON_FAILURE = 3;
  290.   {$EXTERNALSYM MAPI_E_LOGIN_FAILURE}
  291.   MAPI_E_LOGIN_FAILURE               = MAPI_E_LOGON_FAILURE;
  292.   {$EXTERNALSYM MAPI_E_DISK_FULL}
  293.   MAPI_E_DISK_FULL = 4;
  294.   {$EXTERNALSYM MAPI_E_INSUFFICIENT_MEMORY}
  295.   MAPI_E_INSUFFICIENT_MEMORY = 5;
  296.   {$EXTERNALSYM MAPI_E_ACCESS_DENIED}
  297.   MAPI_E_ACCESS_DENIED = 6;
  298.   {$EXTERNALSYM MAPI_E_TOO_MANY_SESSIONS}
  299.   MAPI_E_TOO_MANY_SESSIONS = 8;
  300.   {$EXTERNALSYM MAPI_E_TOO_MANY_FILES}
  301.   MAPI_E_TOO_MANY_FILES = 9;
  302.   {$EXTERNALSYM MAPI_E_TOO_MANY_RECIPIENTS}
  303.   MAPI_E_TOO_MANY_RECIPIENTS = 10;
  304.   {$EXTERNALSYM MAPI_E_ATTACHMENT_NOT_FOUND}
  305.   MAPI_E_ATTACHMENT_NOT_FOUND = 11;
  306.   {$EXTERNALSYM MAPI_E_ATTACHMENT_OPEN_FAILURE}
  307.   MAPI_E_ATTACHMENT_OPEN_FAILURE = 12;
  308.   {$EXTERNALSYM MAPI_E_ATTACHMENT_WRITE_FAILURE}
  309.   MAPI_E_ATTACHMENT_WRITE_FAILURE = 13;
  310.   {$EXTERNALSYM MAPI_E_UNKNOWN_RECIPIENT}
  311.   MAPI_E_UNKNOWN_RECIPIENT = 14;
  312.   {$EXTERNALSYM MAPI_E_BAD_RECIPTYPE}
  313.   MAPI_E_BAD_RECIPTYPE = 15;
  314.   {$EXTERNALSYM MAPI_E_NO_MESSAGES}
  315.   MAPI_E_NO_MESSAGES = 16;
  316.   {$EXTERNALSYM MAPI_E_INVALID_MESSAGE}
  317.   MAPI_E_INVALID_MESSAGE = 17;
  318.   {$EXTERNALSYM MAPI_E_TEXT_TOO_LARGE}
  319.   MAPI_E_TEXT_TOO_LARGE = 18;
  320.   {$EXTERNALSYM MAPI_E_INVALID_SESSION}
  321.   MAPI_E_INVALID_SESSION = 19;
  322.   {$EXTERNALSYM MAPI_E_TYPE_NOT_SUPPORTED}
  323.   MAPI_E_TYPE_NOT_SUPPORTED = 20;
  324.   {$EXTERNALSYM MAPI_E_AMBIGUOUS_RECIPIENT}
  325.   MAPI_E_AMBIGUOUS_RECIPIENT = 21;
  326.   {$EXTERNALSYM MAPI_E_AMBIG_RECIP}
  327.   MAPI_E_AMBIG_RECIP                 = MAPI_E_AMBIGUOUS_RECIPIENT;
  328.   {$EXTERNALSYM MAPI_E_MESSAGE_IN_USE}
  329.   MAPI_E_MESSAGE_IN_USE = 22;
  330.   {$EXTERNALSYM MAPI_E_NETWORK_FAILURE}
  331.   MAPI_E_NETWORK_FAILURE = 23;
  332.   {$EXTERNALSYM MAPI_E_INVALID_EDITFIELDS}
  333.   MAPI_E_INVALID_EDITFIELDS = 24;
  334.   {$EXTERNALSYM MAPI_E_INVALID_RECIPS}
  335.   MAPI_E_INVALID_RECIPS = 25;
  336.   {$EXTERNALSYM MAPI_E_NOT_SUPPORTED}
  337.   MAPI_E_NOT_SUPPORTED = 26;
  338.  
  339.  
  340. { Delphi wrapper calls around Simple MAPI }
  341.  
  342. function MapiLogOn(ulUIParam: Cardinal; lpszProfileName: LPSTR;
  343.   lpszPassword: LPSTR; flFlags: FLAGS; ulReserved: Cardinal;
  344.   lplhSession: PLHANDLE): Cardinal;
  345.  
  346. function MapiLogOff(lhSession: LHANDLE; ulUIParam: Cardinal; flFlags: FLAGS;
  347.   ulReserved: Cardinal): Cardinal;
  348.  
  349. function MapiSendMail(lhSession: LHANDLE; ulUIParam: Cardinal;
  350.   var lpMessage: TMapiMessage; flFlags: FLAGS; ulReserved: Cardinal): Cardinal;
  351.  
  352. function MapiSendDocuments(ulUIParam: Cardinal; lpszDelimChar: LPSTR;
  353.   lpszFilePaths: LPSTR; lpszFileNames: LPSTR; ulReserved: Cardinal): Cardinal;
  354.  
  355. function MapiFindNext(lhSession: LHANDLE; ulUIParam: Cardinal;
  356.   lpszMessageType: LPSTR; lpszSeedMessageID: LPSTR; flFlags: FLAGS;
  357.   ulReserved: Cardinal; lpszMessageID: LPSTR): Cardinal;
  358.  
  359. function MapiReadMail(lhSession: LHANDLE; ulUIParam: Cardinal;
  360.   lpszMessageID: LPSTR; flFlags: FLAGS; ulReserved: Cardinal;
  361.   var lppMessage: PMapiMessage): Cardinal;
  362.  
  363. function MapiSaveMail(lhSession: LHANDLE; ulUIParam: Cardinal;
  364.   var lpMessage: TMapiMessage; flFlags: FLAGS; ulReserved: Cardinal;
  365.   lpszMessageID: LPSTR): Cardinal;
  366.  
  367. function MapiDeleteMail(lhSession: LHANDLE; ulUIParam: Cardinal;
  368.   lpszMessageID: LPSTR; flFlags: FLAGS;
  369.   ulReserved: Cardinal): Cardinal;
  370.  
  371. function MapiFreeBuffer(pv: Pointer): Cardinal;
  372.  
  373. function MapiAddress(lhSession: LHANDLE; ulUIParam: Cardinal;
  374.   lpszCaption: LPSTR; nEditFields: Cardinal; lpszLabels: LPSTR;
  375.   nRecips: Cardinal; var lpRecips: TMapiRecipDesc; flFlags: FLAGS;
  376.   ulReserved: Cardinal; lpnNewRecips: PULONG;
  377.   var lppNewRecips: PMapiRecipDesc): Cardinal;
  378.  
  379. function MapiDetails(lhSession: LHANDLE; ulUIParam: Cardinal;
  380.   var lpRecip: TMapiRecipDesc; flFlags: FLAGS;
  381.   ulReserved: Cardinal): Cardinal;
  382.  
  383. function MapiResolveName(lhSession: LHANDLE; ulUIParam: Cardinal;
  384.   lpszName: LPSTR; flFlags: FLAGS; ulReserved: Cardinal;
  385.   var lppRecip: PMapiRecipDesc): Cardinal;
  386.  
  387. var
  388.   MAPIDLL: string = 'MAPI32.DLL';
  389.  
  390. implementation
  391.  
  392. var
  393.   MAPIModule: HModule = 0;
  394.   LogOn: TFNMapiLogOn = nil;
  395.   LogOff: TFNMapiLogOff = nil;
  396.   SendMail: TFNMapiSendMail = nil;
  397.   SendDocuments: TFNMapiSendDocuments = nil;
  398.   FindNext: TFNMapiFindNext = nil;
  399.   ReadMail: TFNMapiReadMail = nil;
  400.   SaveMail: TFNMapiSaveMail = nil;
  401.   DeleteMail: TFNMapiDeleteMail = nil;
  402.   FreeBuffer: TFNMapiFreeBuffer = nil;
  403.   Address: TFNMapiAddress = nil;
  404.   Details: TFNMapiDetails = nil;
  405.   ResolveName: TFNMapiResolveName = nil;
  406.  
  407. var
  408.   MAPIChecked: Boolean = False;
  409.  
  410. procedure InitMapi;
  411. var
  412.   OSVersionInfo: TOSVersionInfo;
  413.   hkWMS: HKEY;
  414.   MAPIValueSize: Longint;
  415.   MAPIValueBuf: array[0..8] of char;
  416.   rType: Longint;
  417. begin
  418.   if not MAPIChecked then
  419.   begin
  420.     MAPIChecked := True;
  421.     MAPIModule := 0;
  422.  
  423.     OSVersionInfo.dwOSVersionInfoSize := SizeOf(OSVersionInfo);
  424.     GetVersionEx(OSVersionInfo);
  425.     if (OSVersionInfo.dwMajorVersion > 3) or
  426.       ((OSVersionInfo.dwMajorVersion = 3) and
  427.        (OSVersionInfo.dwMinorVersion > 51)) then
  428.     begin
  429.       MAPIValueSize := sizeof(MAPIValueBuf);
  430.       if RegOpenKeyEx(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows Messaging Subsystem',
  431.         0, KEY_READ, hkWMS) <> ERROR_SUCCESS then Exit;
  432.       if RegQueryValueEx(hkWMS, 'MAPI', nil, @rType, @MAPIValueBuf,
  433.         @MAPIValueSize) <> ERROR_SUCCESS then Exit;
  434.       RegCloseKey(hkWMS);
  435.       if not ((MAPIValueBuf[0] = '1') and (MAPIValueBuf[1] = #0)) then Exit;
  436.     end
  437.     else if GetProfileInt('Mail', 'MAPI', 0) = 0 then Exit;
  438.  
  439.     MAPIModule := LoadLibrary(PChar(MAPIDLL));
  440.   end;
  441. end;
  442.  
  443. function MapiLogOn(ulUIParam: Cardinal; lpszProfileName: LPSTR;
  444.   lpszPassword: LPSTR; flFlags: FLAGS; ulReserved: Cardinal;
  445.   lplhSession: PLHANDLE): Cardinal;
  446. begin
  447.   InitMapi;
  448.   if @LogOn = nil then
  449.     @LogOn := GetProcAddress(MAPIModule, 'MAPILogon');
  450.   if @LogOn <> nil then
  451.     Result := LogOn(ulUIParam, lpszProfileName, lpszPassword, flFlags,
  452.       ulReserved, lplhSession)
  453.   else Result := 1;
  454. end;
  455.  
  456. function MapiLogOff(lhSession: LHANDLE; ulUIParam: Cardinal; flFlags: FLAGS;
  457.   ulReserved: Cardinal): Cardinal;
  458. begin
  459.   InitMapi;
  460.   if @LogOff = nil then
  461.     @LogOff := GetProcAddress(MAPIModule, 'MAPILogoff');
  462.   if @LogOff <> nil then
  463.     Result := LogOff(lhSession, ulUIParam, flFlags, ulReserved)
  464.   else Result := 1;
  465. end;
  466.  
  467. function MapiSendMail(lhSession: LHANDLE; ulUIParam: Cardinal;
  468.   var lpMessage: TMapiMessage; flFlags: FLAGS; ulReserved: Cardinal): Cardinal;
  469. begin
  470.   InitMapi;
  471.   if @SendMail = nil then
  472.     @SendMail := GetProcAddress(MAPIModule, 'MAPISendMail');
  473.   if @SendMail <> nil then
  474.     Result := SendMail(lhSession, ulUIParam, lpMessage, flFlags, ulReserved)
  475.   else Result := 1;
  476. end;
  477.  
  478. function MapiSendDocuments(ulUIParam: Cardinal; lpszDelimChar: LPSTR;
  479.   lpszFilePaths: LPSTR; lpszFileNames: LPSTR;
  480.   ulReserved: Cardinal): Cardinal;
  481. begin
  482.   InitMapi;
  483.   if @SendDocuments = nil then
  484.     @SendDocuments := GetProcAddress(MAPIModule, 'MAPISendDocuments');
  485.   if @SendDocuments <> nil then
  486.     Result := SendDocuments(ulUIParam, lpszDelimChar, lpszFilePaths,
  487.       lpszFileNames, ulReserved)
  488.   else Result := 1;
  489. end;
  490.  
  491. function MapiFindNext(lhSession: LHANDLE; ulUIParam: Cardinal;
  492.   lpszMessageType: LPSTR; lpszSeedMessageID: LPSTR; flFlags: FLAGS;
  493.   ulReserved: Cardinal; lpszMessageID: LPSTR): Cardinal;
  494. begin
  495.   InitMapi;
  496.   if @FindNext = nil then
  497.     @FindNext := GetProcAddress(MAPIModule, 'MAPIFindNext');
  498.   if @FindNext <> nil then
  499.     Result := FindNext(lhSession, ulUIParam, lpszMessageType,
  500.       lpszSeedMessageID, flFlags, ulReserved, lpszMessageID)
  501.   else Result := 1;
  502. end;
  503.  
  504. function MapiReadMail(lhSession: LHANDLE; ulUIParam: Cardinal;
  505.   lpszMessageID: LPSTR; flFlags: FLAGS; ulReserved: Cardinal;
  506.   var lppMessage: PMapiMessage): Cardinal;
  507. begin
  508.   InitMapi;
  509.   if @ReadMail = nil then
  510.     @ReadMail := GetProcAddress(MAPIModule, 'MAPIReadMail');
  511.   if @ReadMail <> nil then
  512.     Result := ReadMail(lhSession, ulUIParam, lpszMessageID, flFlags,
  513.       ulReserved, lppMessage)
  514.   else Result := 1;
  515. end;
  516.  
  517. function MapiSaveMail(lhSession: LHANDLE; ulUIParam: Cardinal;
  518.   var lpMessage: TMapiMessage; flFlags: FLAGS; ulReserved: Cardinal;
  519.   lpszMessageID: LPSTR): Cardinal;
  520. begin
  521.   InitMapi;
  522.   if @SaveMail = nil then
  523.     @SaveMail := GetProcAddress(MAPIModule, 'MAPISaveMail');
  524.   if @SaveMail <> nil then
  525.     Result := SaveMail(lhSession, ulUIParam, lpMessage, flFlags, ulReserved,
  526.       lpszMessageID)
  527.   else Result := 1;
  528. end;
  529.  
  530. function MapiDeleteMail(lhSession: LHANDLE; ulUIParam: Cardinal;
  531.   lpszMessageID: LPSTR; flFlags: FLAGS;
  532.   ulReserved: Cardinal): Cardinal;
  533. begin
  534.   InitMapi;
  535.   if @DeleteMail = nil then
  536.     @DeleteMail := GetProcAddress(MAPIModule, 'MAPIDeleteMail');
  537.   if @DeleteMail <> nil then
  538.     Result := DeleteMail(lhSession, ulUIParam, lpszMessageID, flFlags,
  539.       ulReserved)
  540.   else Result := 1;
  541. end;
  542.  
  543. function MapiFreeBuffer(pv: Pointer): Cardinal;
  544. begin
  545.   InitMapi;
  546.   if @FreeBuffer = nil then
  547.     @FreeBuffer := GetProcAddress(MAPIModule, 'MAPIFreeBuffer');
  548.   if @FreeBuffer <> nil then
  549.     Result := FreeBuffer(pv)
  550.   else Result := 1;
  551. end;
  552.  
  553. function MapiAddress(lhSession: LHANDLE; ulUIParam: Cardinal;
  554.   lpszCaption: LPSTR; nEditFields: Cardinal; lpszLabels: LPSTR;
  555.   nRecips: Cardinal; var lpRecips: TMapiRecipDesc; flFlags: FLAGS;
  556.   ulReserved: Cardinal; lpnNewRecips: PULONG;
  557.   var lppNewRecips: PMapiRecipDesc): Cardinal;
  558. begin
  559.   InitMapi;
  560.   if @Address = nil then
  561.     @Address := GetProcAddress(MAPIModule, 'MAPIAddress');
  562.   if @Address <> nil then
  563.     Result := Address(lhSession, ulUIParam, lpszCaption, nEditFields,
  564.       lpszLabels, nRecips, lpRecips, flFlags, ulReserved, lpnNewRecips,
  565.       lppNewRecips)
  566.   else Result := 1;
  567. end;
  568.  
  569. function MapiDetails(lhSession: LHANDLE; ulUIParam: Cardinal;
  570.   var lpRecip: TMapiRecipDesc; flFlags: FLAGS; ulReserved: Cardinal): Cardinal;
  571. begin
  572.   InitMapi;
  573.   if @Details = nil then
  574.     @Details := GetProcAddress(MAPIModule, 'MAPIDetails');
  575.   if @Details <> nil then
  576.     Result := Details(lhSession, ulUIParam, lpRecip, flFlags, ulReserved)
  577.   else Result := 1;
  578. end;
  579.  
  580. function MapiResolveName(lhSession: LHANDLE; ulUIParam: Cardinal;
  581.   lpszName: LPSTR; flFlags: FLAGS; ulReserved: Cardinal;
  582.   var lppRecip: PMapiRecipDesc): Cardinal;
  583. begin
  584.   InitMapi;
  585.   if @ResolveName = nil then
  586.     @ResolveName := GetProcAddress(MAPIModule, 'MAPIResolveName');
  587.   if @ResolveName <> nil then
  588.     Result := ResolveName(lhSession, ulUIParam, lpszName, flFlags,
  589.       ulReserved, lppRecip)
  590.   else Result := 1;
  591. end;
  592.  
  593. initialization
  594. finalization
  595.   if MAPIModule <> 0 then FreeLibrary(MAPIModule);
  596. end.
  597.